// fbo_width and fbo_height are the desired width and height of the FBO.
// For Opengl <= 4.4 or if the GL_ARB_texture_non_power_of_two extension
// is present, fbo_width and fbo_height can be values other than 2^n for
// some integer n.

// Build the texture that will serve as the color attachment for the framebuffer.
GLuint color_renderbuffer;
{%glGenRenderbuffers}(1, &color_renderbuffer);
{%glBindRenderbuffer}( GL_RENDERBUFFER, (GLuint)color_renderbuffer );
{%glRenderbufferStorage}( GL_RENDERBUFFER, GL_RGBA8, fbo_width, fbo_height );
{%glBindRenderbuffer}( GL_RENDERBUFFER, 0 );

// Build the texture that will serve as the depth attachment for the framebuffer.
GLuint depth_renderbuffer;
{%glGenRenderbuffers}(1, &depth_renderbuffer);
{%glBindRenderbuffer}( GL_RENDERBUFFER, (GLuint)depth_renderbuffer );
{%glRenderbufferStorage}( GL_RENDERBUFFER, GL_DEPTH_COMPONENT, fbo_width, fbo_height );
{%glBindRenderbuffer}( GL_RENDERBUFFER, 0 );

// Build the framebuffer.
GLuint framebuffer;
{%glGenFramebuffers}(1, &framebuffer);
{%glBindFramebuffer}(GL_FRAMEBUFFER, (GLuint)framebuffer);
{%glFramebufferRenderbuffer}(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color_renderbuffer);
{%glFramebufferRenderbuffer}(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_renderbuffer);

GLenum status = {%glCheckFramebufferStatus}(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
	// Error

{%glBindFramebuffer}(GL_FRAMEBUFFER, 0);